const {
  cache
} = require('../config/08-defaultConfig');
/**
 * 比对修改时间刷新资源缓存
 * @param {*} stats
 * @param {*} res
 */
function refreshResCacheHeaders(stats, res) { // eslint-disable-line

  // 读取魂村配置 并设置对应的缓存头信息
  const {
    maxAge,
    expires,
    cacheControl,
    lastModified,
    etag
  } = cache;

  if (expires) {
    res.setHeader('Expires', (new Date(Date.now() + maxAge * 1000)).toUTCString());
  }

  if (cacheControl) {
    res.setHeader('Cache-Control', `public, max-age=${maxAge}`);
  }

  if (lastModified) {
    res.setHeader('Last-Modified', stats.mtime.toUTCString()); // mtime 文件的修改时间
  }
  // etag 用于检查文件一致性的电子标签
  // 这里采用的比对格式为 size-lastModifiedTime
  if (etag) {
    const genEtag = stats.size + '-' + new Date(stats.mtime).getTime();
    res.setHeader('ETag', genEtag);
  }

}
// 如果返回true 说明继续使用本地缓存 返回200
// 如果返回false 说明缓存过期 重新缓存 返回304
module.exports = function isNotModified(stats, req, res) {

  // 刷新响应头的缓存相关的设置
  refreshResCacheHeaders(stats, res);

  // 从请求取得请求资源的上次修改时间
  const lastModified = req.headers['if-modified-since'];
  // 从请求取得请求资源的电子标签
  const etag = req.headers['if-none-match'];

  // 如果没有获取到信息 则认为缓存失效
  if (!lastModified && !etag) {
    return false;
  }
  // 如果请求的修改时间和响应的不一致 说明文件变动 缓存失效
  if (lastModified && lastModified !== res.getHeader('Last-Modified')) {
    return false;
  }
  // 如果请求的etag和响应的不一致 说明文件变动 缓存失效
  if (etag && etag !== res.getHeader('ETag')) {
    return false;
  }

  return true;
};
